#include<stdio.h>
int book[60][60],b[60];
int bx1[120],bx2[120];
int count=0;			//用来计数总1共的情况 
int n;
int judge(int i,int j)
{
	int ip=i,jp=j;
	for(jp--,ip--;jp>=1&&ip>=1;jp--,ip--)		//向左上搜索
		if(book[ip][jp])
			return 0;
	return 1;
}
void dfs(int step)
{
	int j;
	if(step==n+1)		//如果能超过棋盘，说明之前的摆放全键无冲，则计数回溯 
	{
		count++;
		return;
	}
	for(j=1;j<=n;j++)
	{
     	if(b[j]==0)
		{
        	b[j]=1;
        	if(bx1[step+j-1]==0&&judge(step,j))
        	{
        		bx1[step+j-1]=1;
          		book[step][j]=1;				//表示放上一个皇后 
            	dfs(step+1);					//开始摆放下一行 
            	book[step][j]=0;				//递归返回后取回皇后继续下一次排列 
				bx1[step+j-1]=0;
	        }
       		b[j]=0;
        }
	}
	return;
}
int main()
{
	scanf("%d",&n);getchar();
	dfs(1);
	printf("%d\n",count);
	return 0;
}
